home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
FM Towns: Free Software Collection 4
/
FM Towns Free Software Collection 4 - Disc 1.iso
/
pao
/
towns
/
cdplay
/
src
/
coninit.c
< prev
next >
Wrap
Text File
|
1991-10-18
|
4KB
|
134 lines
/** << High C & 386ASM >> *****************************************************
**
** コンソール初期化プログラム( MS-DOS上でも有効! )
**
** ☆ 画面のクリアをしていないので、必要ならば EGB_init() 等でクリアのこと.
**
** < HISTORY >
** 1991.03.06 : CREATE
**
** Programmed by Y.Hirata ( Nifty ID : NAB03321 )
**
******************************************************************************/
extern inp( unsigned ) ;
extern outp( unsigned,unsigned ) ;
#define CRTC_addr 0x0440 /* CRTC : アドレス・レジスタ */
#define CRTC_data 0x0442 /* CRTC : データ下位 */
#define VDC_addr 0x0448 /* ビデオ出力制御 : アドレス・レジスタ */
#define VDC_data 0x044a /* ビデオ出力制御 : 内部レジスタ・データ */
#define VRC_addr 0x0458 /* VRAMアクセス制御 : アドレス・レジスタ */
#define VRC_data 0x045a /* VRAMアクセス制御 : 内部レジスタ・データ */
static int CRTC[]= {
0x0040,0x0320,0x0000,0x0000,0x035F,0x0000,0x0010,0x0000,
0x036F,0x009C,0x031C,0x009C,0x031C,0x0040,0x0360,0x0040,
0x0360,0x0000,0x009C,0x0000,0x0050,0x0000,0x009C,0x0000,
0x0080,0x004A,0x0001,0x0000,0x001F,0x0003,0x0000,0x0150 } ;
static char VDC[]= { 0x15,0x09 } ;
#define PALETTE_ADDR 0x0FD90
#define PALETTE_B_DATA 0x0FD92
#define PALETTE_R_DATA 0x0FD94
#define PALETTE_G_DATA 0x0FD96
static unsigned char Palette[16][3]= {
/* B R G : 上位 4ビット */
0, 0, 0,
176, 0, 0,
0,176, 0,
176,176, 0,
0, 0,176,
176, 0,176,
0,176,176,
176,176,176,
64, 64, 64,
255, 0, 0,
0,255, 0,
255,255, 0,
0, 0,255,
255, 0,255,
0,255,255,
255,255,255
} ;
/************************** FM音源のポートへの書き込み ***********************/
void FM_write( int addr,int data )
{
int c ;
while ( inp( 0x04d8 ) & 0x80 ) ;
outp( 0x04d8, addr ) ;
for ( c=0; c<4; c+=1 ) ;
while ( inp( 0x04d8 ) & 0x80 ) ;
outp( 0x04da, data ) ;
}
/******************************** コンソール設定 ********************************/
void coninit()
{
int c ;
/* マスク解除 */
outp( VRC_addr,0 ) ;
outp( VRC_data,0xff ) ;
outp( VRC_data+1,0xff ) ;
outp( VRC_addr,1 ) ;
outp( VRC_data,0xff ) ;
outp( VRC_data+1,0xff ) ;
/* ビデオ出力制御 I/O 設定 */
outp( VDC_addr,0 ) ;
outp( VDC_data,VDC[0] ) ;
outp( VDC_addr,1 ) ;
outp( VDC_data,VDC[1] | 0x20 ) ;
/* CRTC I/O 設定 */
outp( CRTC_addr,0x1c ) ;
outp( CRTC_data+1,0 ) ;
while ( inp( CRTC_data+1 ) & 0x80 ) ;
for ( c=0; c<32; c++ ) {
outp( CRTC_addr,c ) ;
outp( CRTC_data ,(CRTC[c] & 0xff) ) ;
outp( CRTC_data+1,(CRTC[c] >> 8) ) ;
}
outp( CRTC_addr,0x1c ) ;
outp( CRTC_data+1,((CRTC[0x1c] >> 8) | 0x80) ) ;
outp( VDC_addr,1 ) ;
outp( VDC_data,VDC[1] & 0x0C ) ;
/* パレット設定(1) */
for ( c=0 ; c<16 ; c++ ) {
outp( PALETTE_ADDR,c ) ;
outp( PALETTE_B_DATA,Palette[c][0] ) ;
outp( PALETTE_R_DATA,Palette[c][1] ) ;
outp( PALETTE_G_DATA,Palette[c][2] ) ;
}
outp( VDC_addr,1 ) ;
outp( VDC_data,VDC[1] | 0x20 ) ;
/* パレット設定(2) */
for ( c=0 ; c<16 ; c++ ) {
outp( PALETTE_ADDR,c ) ;
outp( PALETTE_B_DATA,Palette[c][0] ) ;
outp( PALETTE_R_DATA,Palette[c][1] ) ;
outp( PALETTE_G_DATA,Palette[c][2] ) ;
}
outp( VDC_addr,1 ) ;
outp( VDC_data,VDC[1] ) ;
/* FM音源のタイマBを始動 */
FM_write( 0x21,0x00 ) ;
FM_write( 0x2c,0x80 ) ;
FM_write( 0x2b,0x00 ) ;
FM_write( 0x27,0x30 ) ;
FM_write( 0x26,0xdd ) ;
FM_write( 0x27,0x2a ) ;
}